C1Chart(在线文档 'C1Chart 类')控件在任何数据系列上都允许自定义聚合。通过为AggregateGroupSelector(在线文档 'AggregateGroupSelector 委托')属性定义您自己自定义聚合逻辑,C1Chart控件可以按照任何您期望的方式对数据进行分组。例如,您可以在日期字段中提供分组,以汇总每月或每年的值。你甚至可以建立自己的数值范围和类别对数据点进行分组。
本主题假定您在XAML中创建了一个C1Chart 控制并把它命名为“c1chart1”。关于如何通过XAML创建一个控件的更多信息,请参见快速入门(在线文档)或者概念和主要属性主题。
为了创建自定义聚合函数,首先需要创建待汇总的数据。您可以创建一个简单的业务对象,具有两个属性:Value(双精度浮点数)和日期(日期类型)。在下面的例子中,这个业务对象被称为SampleItem。做为参考,您可以在本主题的底部找到这个类型的定义。创建一个包含随机数据的ObservableCollection:
C# |
拷贝代码
|
---|---|
Random rnd = new Random(); ObservableCollection<SampleItem> _items = new ObservableCollection<SampleItem>(); for(int i = 0; i < 400; i++) { _items.Add(new SampleItem { Value = rnd.Next(0, 100), Date = DateTime.Now.AddDays(i) }); } |
之后绑定您的XYDataSeries至项目的集合:
C# |
拷贝代码
|
---|---|
// 配置数据系列 var ds = new XYDataSeries() { ItemsSource = _items, ValueBinding = new Binding { Path = new PropertyPath("Value") }, XValueBinding = new Binding { Path = new PropertyPath("Date") }, Aggregate = Aggregate.Sum, AggregateGroupSelector = GroupSelectorByDate, Label = "Sales" }; |
您在上面的代码中设置了两个关键属性:Aggregate 和AggregateGroupSelector。Aggregate 属性决定用作聚合图表数据的函数。AggregateGroupSelector 属性决定为数据系列提供分组选择器的函数。在您设置了自定义函数之前,虽说添加系列到图表可以设置沿着x-轴显示日期。您还可以设置X轴为显示时间,因此日期显示正确:
C# |
拷贝代码
|
---|---|
// 配置图表 c1Chart1.BeginUpdate(); c1Chart1.ChartType = ChartType.Column; // 添加数据系列 c1Chart1.Data.Children.Add(ds); // 使用特定格式的时间坐标轴 c1Chart1.View.AxisX.IsTime = true; c1Chart1.View.AxisX.AnnoFormat = "yyyy"; c1Chart1.View.AxisX.UseExactLimits = true; // 应用一些风格 c1Chart1.View.AxisX.MajorGridStrokeThickness = 0; c1Chart1.View.AxisY.MajorGridFill = new SolidColorBrush(Colors.LightGray); c1Chart1.EndUpdate(); |
注意,当您需要沿x轴显示日期,您需要设置的时间属性设置为true。您将按年进行分组,因此请注意,AnnoFormat属性已经被设置为显示完整的年份。
下面的代码定义了GroupSelectorByDate 函数。该函数将调用您的图表中的每个数据点,并确定该数据所属的组。
C# |
拷贝代码
|
---|---|
double GroupSelectorByDate(double x, double y, object o) { // 将年份作为双精度浮点数值返回 DateTime dt = x.FromOADate(); // 为了按照年份进行分组,我们返回日期的年份信息 // 同时也设置 AnnoFormat 为 "yyyy" return new DateTime(dt.Year, 1, 1).ToOADate(); } |
该分组选择器函数将始终有三个参数,将总是返回一个双精度浮点数值。属于同一组的数据点应该返回同一个值,该值从该函数返回。因为您需要按年进行分组,该函数返回一个新的DateTime类型的值,该值设置为目标年份的第一天。每一个发生在2014年的数据点将通过该函数返回相同的日期值(作为一个双精度浮点数值),因此被放在同一个分组。
现在,如果你还想通过一个月进行分组的话,那么你只需要修改其中两行代码:
C# |
拷贝代码
|
---|---|
double GroupSelectorByDate(double x, double y, object o) { // 返回年份为双精度浮点数 DateTime dt = x.FromOADate(); // 为了按照月份进行分组,我们返回该日期的年份和月份值 return new DateTime(dt.Year, dt.Month, 1).ToOADate(); } |
您也必须要修改AnnoFormat属性以便能够正确显示月份:
C# |
拷贝代码
|
---|---|
c1Chart1.View.AxisX.AnnoFormat = "MM/yyyy";
|
由此产生的图表将类似于以下图像:
这里是SampleItem 类,供参考:
C# |
拷贝代码
|
---|---|
public class SampleItem { public double Value { get; set; } public DateTime Date { get; set; } } |